package com.policenacorp.ejb;

import java.lang.reflect.ParameterizedType;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

public abstract class AbstractBusiness<Entidade, PK> implements
		IAbstractBusiness<Entidade, PK> {

	@PersistenceContext(unitName = "ex01PU")
	private EntityManager manager;

	private Class<Entidade> classeEntidade;

	@SuppressWarnings("unchecked")
	public AbstractBusiness() {
		classeEntidade = (Class<Entidade>) ((ParameterizedType) getClass()
				.getGenericSuperclass()).getActualTypeArguments()[0];
	}

	/**
	 * Grava uma nova entidade no banco.
	 * 
	 * @param entity
	 */
	public void save(Entidade entity) {
		manager.persist(entity);
	}

	/**
	 * Encontra uma entidade dada a chave primaria da mesma.
	 * 
	 * @param chave
	 * @return
	 */
	public Entidade findById(PK chave) {
		return manager.find(classeEntidade, chave);
	}

	/**
	 * Atualiza uma entidade, sobrescrevendo alteracoes na tabela.
	 * 
	 * @param entity
	 * @return
	 */
	public Entidade update(Entidade entity) {
		return manager.merge(entity);
	}

	/**
	 * Remove da tabela uma determinada entidade.
	 * 
	 * @param entity
	 */
	public void remove(Entidade entity) {
		Entidade attachedEntity = manager.merge(entity);
		manager.remove(attachedEntity);
	}

}
